/*
 * Esta clase se utilizará como herramienta para el manejo de archivos
 */
package Utils;

import ImagenesDBGad.IO.Imagen;
import java.awt.Component;
import java.awt.FileDialog;
import java.awt.Frame;
import java.io.*;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.image.JPEGTranscoder;

/**
 *
 * @author Ivan Pianetti @BIPiane
 * http://code.google.com/p/imagenesdb-gad/source/browse/
 */
public class ArchUtils {

    private static String unixBarra = "\\/";
    private static String windowsBarra = "\\\\";
    private static String puntoExtencion = "\\.";
    //
    public static String carpetaTemporal = System.getProperty("java.io.tmpdir");
    public static String urlSVGAuxiliar = System.getProperty("java.io.tmpdir") + "SVGAuxiliar.svg";

    public static void main(String[] args) {

        System.out.println("URL temporal: " + carpetaTemporal);
        System.out.println("SVG: " + ArchUtils.getXML("src/SQLPostGis/SQLscriptDB-Gad.sql"));


        String texto1 = "/Mac/Desktop/sol_y_nubes.svg";
        System.out.println("Ruta: " + texto1);
        System.out.println("Nombre: " + ArchUtils.getNombreArchivo(texto1));
        System.out.println("Extensión: " + ArchUtils.getExtencionArchivo(texto1));

        texto1 = "C:\\Windows\\Desktop\\GAD2012.png";
        System.out.println("\nRuta: " + texto1);
        System.out.println("Nombre: " + ArchUtils.getNombreArchivo(texto1));
        System.out.println("Extensión: " + ArchUtils.getExtencionArchivo(texto1));
    }

    /**
     * Obtiene la extensión de un achivo
     *
     * @param arch
     * @return
     */
    public static String getExtencionArchivo(String arch) {
        String extencion = "";
        String[] temp = arch.split(puntoExtencion);
        if (temp.length > 1) {
            extencion = temp[temp.length - 1].toLowerCase();
        }
        return extencion;
    }

    /**
     * Obtiene la el nombre de un achivo sin la extención
     *
     * @param rutaArchivo
     * @return
     */
    public static String getNombreArchivo(String rutaArchivo) {
        String nombre = "";
        if (rutaArchivo.length() > 0) {
            String rutaFormart = "";
            String delimitador = "";
            String fileSystem = System.getProperty("os.name");
            if (fileSystem.equalsIgnoreCase("Mac OS X")) {
                rutaFormart = ArchUtils.rutaWindowsToUnix(rutaArchivo);
                delimitador = unixBarra;
            } else {
                rutaFormart = ArchUtils.rutaUnixToWindows(rutaArchivo);
                delimitador = windowsBarra;
            }
            String[] temp = rutaFormart.split(delimitador);
            String nomExt = temp[temp.length - 1];
            delimitador = "\\.";
            temp = nomExt.split(delimitador);
            nombre = temp[0];
        }
        return nombre;
    }

    /**
     * Transforma una ruta de Windows con "\" a una ruta UNIX con "/"
     *
     * @param ruta
     * @return
     */
    private static String rutaWindowsToUnix(String ruta) {
        String rutaFormart = "";
        rutaFormart = ruta.replaceAll(windowsBarra, unixBarra);
        return rutaFormart;
    }

    /**
     * Transforma una ruta de UNIX con "/" a una ruta Windows con "\"
     *
     * @param ruta
     * @return
     */
    private static String rutaUnixToWindows(String ruta) {
        String rutaFormart = "";
        rutaFormart = ruta.replaceAll(unixBarra, windowsBarra);
        return rutaFormart;
    }

    public static String seleccionarArchivo() {
        String url = "";
        JFileChooser fc = new JFileChooser("./src/Imagenes");
        Component panel = new JPanel();
        int choice = fc.showOpenDialog(panel);
        if (choice == JFileChooser.APPROVE_OPTION) {
            File f = fc.getSelectedFile();
            url = f.toURI().toString();
        }
        return url;
    }

    public static String guardarComoArchivo(String nombreArchivo) {
        FileDialog fd = new FileDialog(new Frame(), "Guardar como", FileDialog.SAVE);
        fd.setFile(nombreArchivo);
        fd.show();
        String pathArch = "";
        pathArch = fd.getDirectory() + fd.getFile();
        fd.dispose();
        return pathArch;
    }

    /**
     * Obtiene el codigo XML de una imagen SVG a partir de la URL del archivo
     *
     * @param baseURI
     * @return
     */
    public static String getXML(String baseURI) {
        String XML = "";

        try {
            baseURI = baseURI.replaceAll("file:", "");
            baseURI = baseURI.replaceAll("%20", " ");

            FileInputStream fstream = new FileInputStream(baseURI);
            DataInputStream entrada = new DataInputStream(fstream);
            BufferedReader buffer = new BufferedReader(new InputStreamReader(entrada));
            String strLinea;
            while ((strLinea = buffer.readLine()) != null) {
                XML += strLinea;
            }
            entrada.close();
        } catch (Exception e) {
            System.err.println("Ocurrio un error: " + e.getMessage());
        }
        return XML;
    }

    public static void crearSVGAuxiliar(String camino) {
        try {
            File f = new File(urlSVGAuxiliar);
            if (f.exists()) {
                f.delete();
            }
            FileWriter fichero = new FileWriter(f);
            PrintWriter pw = new PrintWriter(fichero);

            pw.println("<?xml version='1.0' standalone='no'?>");
            pw.println("<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 20010904//EN' 'http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd'>");
            pw.println("<svg  version = '1.0' xmlns = 'http://www.w3.org/2000/svg'>");
            pw.println("<path id ='camino' d='" + camino + "'/>");
            pw.println("</svg>");

            pw.close();
            fichero.close();
        } catch (Exception e) {
        }
    }

    /**
     * Tima una Imagen y crea un archivo SVG Auxiliar en la ruta predeterminada
     * a partir del codigo XML de la Imagen
     *
     * @param img
     */
    public static void crearSVGAuxiliar(Imagen img) {
        ArchUtils.guardarComoSVG(img, urlSVGAuxiliar);
    }

    public static void guardarComoJPG(Imagen imgSVGResultado, String url) {
        try {
            ArchUtils.crearSVGAuxiliar(imgSVGResultado);
            //Step -1: We read the input SVG document into Transcoder Input
            String svg_URI_input = new File(urlSVGAuxiliar).toURL().toString();
            TranscoderInput input_svg_image = new TranscoderInput(svg_URI_input);
            FileOutputStream jpg_ostream = new FileOutputStream(url);
            TranscoderOutput output_jpg_image = new TranscoderOutput(jpg_ostream);
            // Step-3: Create JPEGTranscoder and define hints
            JPEGTranscoder my_converter = new JPEGTranscoder();
            my_converter.addTranscodingHint(JPEGTranscoder.KEY_QUALITY, new Float(.9));
            // Step-4: Write output
            my_converter.transcode(input_svg_image, output_jpg_image);
            // Step 5- close / flush Output Stream
            jpg_ostream.flush();
            jpg_ostream.close();
        } catch (Exception ex) {
        }
    }

    public static void guardarComoSVG(Imagen img, String url) {
        try {
            File f = new File(url);
            if (f.exists()) {
                f.delete();
            }
            FileWriter fichero = new FileWriter(f);
            PrintWriter pw = new PrintWriter(fichero);

            pw.println(img.getCodXML());

            pw.close();
            fichero.close();
        } catch (Exception e) {
        }
    }
}
